extends CharacterBody2D

var speed := 100
var JUMP_VELOCITY = -350

@onready var player: CharacterBody2D = $"."
@onready var animation_player: AnimationPlayer = $AnimationPlayer
@onready var graphic: Node2D = $Graphic
@onready var sprite_2d: Sprite2D = $Graphic/Sprite2D

func _enter_tree() -> void:
	# 设置该节点的多人权限
	set_multiplayer_authority(name.to_int())

func _ready() -> void:
	# 出生位置
	position = Vector2(100,0)
	# 如果不是服务端，再做下面的处理
	if player.name != "1":
		# 修改出生位置
		position = Vector2(200,0)
		# 修改朝向（默认朝右，改为朝左）
		graphic.scale.x = -1
		# 设置一下材质（角色身体的颜色，提前随便改了一种）
		var sm = ShaderMaterial.new()
		sm.shader = load("res://player.gdshader")
		sprite_2d.material = sm

func _physics_process(delta: float) -> void:
	# 如果不是本节点的控制者，则无法移动，直接终止方法
	# 根据设置的节点的权限id，与本身的唯一id做对比，如果一致，则权限正确d
	if not is_multiplayer_authority():
		return
	
	# 如果不在地面上，则按重力下落
	if !is_on_floor():
		velocity += get_gravity() * delta
	
	# 如果按下空格并且当前在地面上，则跳起指定的高度（之后按重力自动下落）
	if Input.is_action_just_pressed("ui_accept") and is_on_floor():
		velocity.y = JUMP_VELOCITY
	
	# 获得当前按下键盘的情况（从项目设置中绑定按键），第一个被按下返回-1，第二个是1，没有按下是0
	var direction := Input.get_axis("move_left", "move_right")
	# 按下左（A）就向左走，按下右（D）就向右走，否则不走
	velocity.x = direction * speed
	# 如果按下了左或者右，用镜像的方式调整角色朝左还是朝右（scale.x，-1是朝左，1是朝右）
	if not is_zero_approx(direction):
		graphic.scale.x = -1 if direction < 0 else 1
		# rpc是远程调用前面的方法，用于局域网远程调用，函数定义时需要指定rpc的
		update_player_animation.rpc("run")
	else:
		update_player_animation.rpc("idle")
	# 调用系统提供的移动函数，将会按velocity指定的方向移动
	move_and_slide()

@rpc("authority", "call_local")
func update_player_animation(animation_name: String) -> void:
	# 播放指定的动画
	animation_player.play(animation_name)
